package com.relytosoft.mizar.media.analyze.services.service.behavior;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.relytosoft.dubhe.common.core.base.page.PageQuery;
import com.relytosoft.mizar.media.analyze.api.entity.behavior.AyBehaviorTaskSon;
import com.relytosoft.mizar.media.analyze.api.pojo.dto.AyBehaviorTaskPlanDto;
import com.relytosoft.mizar.media.analyze.api.pojo.dto.AyBehaviorTaskSonDto;
import com.relytosoft.mizar.media.analyze.api.pojo.dto.AyTaskIdDto;
import com.relytosoft.mizar.media.analyze.api.pojo.query.AyBehaviorTaskSonQuery;
import com.relytosoft.mizar.media.analyze.api.pojo.vo.AyBatchVo;
import com.relytosoft.mizar.media.analyze.api.pojo.vo.AyBehaviorTaskPlanVo;
import com.relytosoft.mizar.media.analyze.api.pojo.vo.AyBehaviorTaskSonVo;

import java.util.List;

/**
 * @author lj
 * @date 2022/6/7 10:16
 */
public interface AyBehaviorTaskSonService extends IService<AyBehaviorTaskSon> {

    /**
     * 分页条件查询行为分析子任务
     *
     * @param pageQuery              分页对象
     * @param ayBehaviorTaskSonQuery 查询条件
     * @return 分页结果
     */
    IPage<AyBehaviorTaskSonVo> selectAyBehaviorTaskSonPageList(PageQuery pageQuery,
                                                               AyBehaviorTaskSonQuery ayBehaviorTaskSonQuery);


    /**
     * 根据主任务id删除子任务
     *
     * @param behaviorTaskIds 主任务id
     * @return 删除结果
     */
    boolean deleteByMainTaskId(List<Integer> behaviorTaskIds);

    /**
     * 删除已停止，未删除的子任务，并重新创建
     *
     * @param deleteTaskSons 已删除的子任务
     * @param insertTaskSons 需要重新创建的子任务
     * @param behaviorTaskId 与之关联的主任务id
     * @return 是否删除成功
     */
    boolean deleteAndInsertTaskSons(List<AyBehaviorTaskSon> deleteTaskSons, List<AyBehaviorTaskSon> insertTaskSons, Integer behaviorTaskId);


    /**
     * 修改异常和未开始的子任务信息
     *
     * @param startTaskSons  开始的子任务
     * @param behaviorTaskId 与之关联的主任务id
     * @return 是否修改成功
     */
    boolean updateNeedStartTaskSons(List<AyBehaviorTaskSon> startTaskSons, Integer behaviorTaskId);


    /**
     * 停止子任务
     *
     * @param stopTaskSons   停止的子任务
     * @param behaviorTaskId 与之关联的主任务id
     * @return 是否停止成功
     */
    boolean stopSonTask(List<AyBehaviorTaskSon> stopTaskSons, Integer behaviorTaskId);

    /**
     * 根据主任务ID和设备信息创建子任务
     *
     * @param ayBehaviorTaskSonArrayList 需要添加的子任务
     * @param ayBehaviorTaskSonDto       子任务信息
     * @return 创建结果
     */
    AyBatchVo insertAyBehaviorTaskSon(AyBehaviorTaskSonDto ayBehaviorTaskSonDto, List<AyBehaviorTaskSon> ayBehaviorTaskSonArrayList);

    /**
     * 根据子任务ID删除子任务
     *
     * @param ids 子任务ID
     * @return 删除结果
     */
    boolean deleteAyBehaviorTaskSon(List<Integer> ids);

    /**
     * 参数据校验并获取可以创建的子任务
     *
     * @param ayTaskIdDto 需要启动的子任务信息
     * @param ayBatchVo   结果信息
     * @return 可以创建的子任务
     */
    List<AyBehaviorTaskSon> canStartAyBehaviorTaskSon(AyTaskIdDto ayTaskIdDto, AyBatchVo ayBatchVo);

    /**
     * 启动任务
     *
     * @param ayBatchVo                  结果信息
     * @param insertTaskSons             已结束，未删除的子任务
     * @param startTaskSons              异常，未开始，未删除的子任务
     * @param ayBehaviorTaskSonArrayList 需要启动的子任务
     */
    void startTask(List<AyBehaviorTaskSon> insertTaskSons, List<AyBehaviorTaskSon> startTaskSons,
                   List<AyBehaviorTaskSon> ayBehaviorTaskSonArrayList, AyBatchVo ayBatchVo);

    /**
     * 参数据校验并获取可以停止的子任务
     *
     * @param taskIdDto 需要停止的子任务信息
     * @param ayBatchVo 结果信息
     * @return 可以停止的子任务
     */
    List<AyBehaviorTaskSon> canStopAyBehaviorTaskSon(AyTaskIdDto taskIdDto, AyBatchVo ayBatchVo);

    /**
     * 停止任务
     *
     * @param stopTaskSons               构造的停止子任务
     * @param ayBehaviorTaskSonArrayList 可以停止的子任务
     * @param ayBatchVo                  结果信息
     */
    boolean stop(List<AyBehaviorTaskSon> stopTaskSons, List<AyBehaviorTaskSon> ayBehaviorTaskSonArrayList, AyBatchVo ayBatchVo);

    /**
     * 发送创建子任务消息
     *
     * @param ayBehaviorTaskSon 子任务信息
     */
    void sendMessage(AyBehaviorTaskSon ayBehaviorTaskSon);


    /**
     * 修改或添加子任务布防计划
     *
     * @param ayBehaviorTaskPlanDto 子任务布防计划信息
     * @return 修改结果
     */
    boolean sonTaskAddPlan(AyBehaviorTaskPlanDto ayBehaviorTaskPlanDto);

    /**
     * 子任务布防详情查看
     *
     * @param id 子任务ID
     * @return 子任务布防详情
     */
    AyBehaviorTaskPlanVo sonTaskPlanDetail(Integer id);

    /**
     * 子任务布防计划删除
     *
     * @param ids 子任务id
     * @return 删除结果
     */
    boolean sonTaskDeletePlan(List<Integer> ids);


    /**
     * 停止任务，发送删除消息
     *
     * @param ayBehaviorTaskSon 子任务信息
     */
    void sendDeleteMessage(AyBehaviorTaskSon ayBehaviorTaskSon);
}
